package com.cw.java8.stream;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Stream;

/**
 * 流式操作01，流的创建
 */
public class StreamTest01 {

    public static void main(String[] args) {
        String[] strArray = {"张三丰", "张翠山", "殷素素", "张无忌", "谢逊"};

        //1、通过集合创建流
        List<String> list = Arrays.asList("a","b","c");
        Stream<String> stream = list.stream();
        //使用List集合创建一个stream实例
        List<Integer> lists = new LinkedList<>();
        lists.add(5);
        lists.add(4);
        lists.add(3);
        lists.add(2);
        lists.add(1);

        Stream<Integer> stream3 = lists.stream();
        stream3.forEach(System.out :: println);
        System.out.println("-----------------------------");

        //2、使用Array数组创建一个stream实例
        Stream<String> stream1 = Arrays.stream(strArray);
        stream1.forEach(System.out::println);
        System.out.println("-----------------------------");

        //3、使用Stream.of静态方法创建一个stream实例
        Stream<String> stream2 = Stream.of(strArray);
        stream2.forEach(System.out :: println);
        System.out.println("-----------------------------");

        //4、通过Stream.generate()创建流：
        //可以使用Stream类的generate()方法来创建一个无限流，需要提供一个Supplier来生成流中的元素。例如：
        Stream<String> stream4 = Stream.generate(()->"element");

        //5. 通过Stream.iterate()创建流：
        //可以使用Stream类的iterate()方法来创建一个无限流，需要提供一个初始值和一个UnaryOperator来生成流中的元素。例如：
        Stream<Integer> stream5 = Stream.iterate(0,n->n+1);

        //6. 通过文件、网络、IO流等方式来创建流：
        //Stream<String> stream6 = Files.lines(Paths.get("file.txt"));
        //Stream<String> stream6 = BufferedReader.lines();

        //4、使用Stream.Builder创一个stream实例
        Stream.Builder<String> streamBuilder = Stream.builder();
        streamBuilder.accept("北京");
        streamBuilder.accept("上海");
        streamBuilder.accept("深圳");
        streamBuilder.add("杭州");
        streamBuilder.add("广州");

        Stream<String> stream7 = streamBuilder.build();
        stream7.forEach(System.out :: println);
    }
}
